import re
'''
编写一个名为 load_events() 的函数，读取 events.txt 文件，并返回一个元组列表，每个元组包含一个年份和相应的描述。
但是，你将忽略发生在公元 1000 年之前的任何事件。为此，你需要：
 a) 确定你的函数是否需要输入参数（可能需要，也可能不需要）。
 b) 创建一个名为 events 的空列表，最终将包含单个历史事件（即元组列表）。
c) 行读取文件逐行提取所需的数据。在此过程中，你需要：

拆分行以分离年份和事件描述。
编写一个正则表达式来过滤发生在公元 1000 年之前的事件。
创建一个元组，其中第一个元素是年份，第二个元素是表示事件描述的字符串。
将该元组添加到 events 列表中。 
d) 你将返回一个元组列表（每个项目是一个事件的元组）。
'''
# a) 确定你的函数是否需要输入参数（可能需要，也可能不需要）
def load_events():
    filename = './events.txt'
    # b) 创建一个名为 events 的空列表，最终将包含单个历史事件（即元组列表）。
    events = []
    with open(filename, 'r') as file:
        # c) 行读取文件逐行提取所需的数据
        for line in file:
            # 拆分行以分离年份和事件描述。
            year = line.strip().split(": ")[0]
            description = line.strip().split(": ")[1]
            # 编写一个正则表达式来过滤发生在公元 1000 年之前的事件。
            # 保留一千年以前的正则表达式
            # pattern = r'^(?:[0-9]{1,3})$'
            # 保留一千年以后的正则表达式
            pattern = r'^(?:[1-9][0-9]{3}|1[0-9]{3})$'
            match = re.match(pattern, year)
            # 检查年份是否大于或等于1000
            if match:
                print("输出验证年份：",year)
                # 创建一个元组，其中第一个元素是年份，第二个元素是表示事件描述的字符串。
                eventTuple = (year, description)
                # 将该元组添加到 events 列表中。
                events.append(eventTuple)
    return events
'''
编写一个名为 annotate_event() 的函数，接受一个事件（即一个包含年份和描述的元组），从以下的额外细节字典中检索附加细节，
并将事件的完整描述（即事件描述与附加细节结合）写入文件。为此，你需要： 
a) 将以下变量复制到你的脚本中：
b) 确定 annotate_event() 函数需要什么输入参数：记住，一个函数只能处理它所知道的数据，因此你需要提供它所需的数据作为输入参数（参数）。 
c) 使用事件元组的年份作为字典键，结合附加细节来查看是否能够检索到该事件的附加信息。（这意味着你需要使用成员测试。）

如果找到了该事件的附加细节，你将：

创建一个以事件年份命名的新文件（例如，1066.txt）。
在第一行写下事件描述，接着在下一行写下该事件的附加细节。
在这两个函数下方，你将首先调用 load_events() 函数，这将返回以元组列表表示的事件。

然后你将对从 load_events() 获取的每个事件调用 annotate_event() 函数。
这意味着你需要遍历从 load_events() 获得的事件列表，然后对每个事件调用 annotate_event()。
'''
additional_details = {
    "1066": "Normans defeat the English.",
    "1215": "King John of England agrees to it.",
    "1492": "Columbus reaches the New World.",
    "1588": "Major naval victory for England against Spain.",
    "1776": "USA declares independence from Britain.",
    "1789": "Storming of the Bastille in Paris.",
    "1804": "Napoleon establishes the First French Empire.",
    "1859": "Foundational text of evolutionary biology.",
    "1865": "Confederate General Lee surrenders to Union General Grant.",
    "1876": "First successful demonstration of the telephone.",
    "1914": "Caused by assassination of Archduke Franz Ferdinand.",
    "1920": "19th Amendment to the U.S. Constitution ratified.",
    "1939": "Caused by Germany's invasion of Poland.",
    "1963": "Delivered in Washington D.C.",
    "1969": "Neil Armstrong becomes the first human on the Moon.",
    "1989": "Marks end of the Cold War.",
    "2008": "Major banks and financial institutions collapse."
}
# b) 确定 annotate_event() 函数需要什么输入参数：记住，一个函数只能处理它所知道的数据，因此你需要提供它所需的数据作为输入参数（参数）。
def annotate_event(event):
    year, description = event
    # c) 使用事件元组的年份作为字典键，结合附加细节来查看是否能够检索到该事件的附加信息。（这意味着你需要使用成员测试。if语句）
    additional_detail = additional_details.get(str(year), None)

    # 创建一个以事件年份命名的新文件（例如，1066.txt）。
    if additional_detail:
        filename = f"./{year}.txt"
        with open(filename, 'w') as file:
            # 在第一行写下事件描述，接着在下一行写下该事件的附加细节。
            file.write(description + '\n')
            file.write(additional_detail)
if __name__ == "__main__":
    # 在这两个函数下方，你将首先调用 load_events()函数，这将返回以元组列表表示的事件。
    events = load_events()
    # 这意味着你需要遍历从 load_events() 获得的事件列表，然后对每个事件调用 annotate_event()。
    for event in events:
        annotate_event(event)